import { ElLoading } from "element-plus";

// 定义一个默认配置
const defaultOptions = {
    lock: true,
    text: '正在加载',
    background: 'rgba(0,0,0,0.1)'
}

/**
 * 传入一个方法fn,在它执行周期内,加上全屏loading
 * 如果：
 * 1. fn是同步方法，结束后隐藏loading
 * 2. 如果是异步方法，resolve后隐藏loading
 * 3. 报错后隐藏loading并抛出错误
 * @param {*} fn 函数
 * @returns Function 一个新的函数
 */
export const withLoading = (fn, loadingElement, options = {}) => {
    let loading;
    const shwoLoading = (options) => {
        loading = ElLoading.service({ ...options, target: loadingElement })
    }
    const hideLoading = () => {
        if (loading) {
            loading.close()
        }
    }

    // 进行assign
    const _options = Object.assign(defaultOptions, options)

    // 创建一个新方法
    const newFn = async (...args) => {
        shwoLoading(_options);
        try {
            const result = await fn(...args)

            await new Promise(resolve => setTimeout(resolve, 500))
            return result
        } catch (err) {
            hideLoading()
            throw err
        } finally {
            hideLoading()
        }
    }
    // 返回这个新函数
    return newFn
}